import sounddevice as sd
import datetime
import sys
import time

class Microphone:
    """
    用于处理麦克风操作的麦克风类。
    """

    def __init__(self, sample_rate=16000):
        """
        初始化函数，初始化麦克风类参数
        :param sample_rate: 采样率，默认16000
        :param model_dir: 语音模型目录，默认为"./model/speech"
        """
        self.sample_rate = sample_rate
        self.device_id = None
        self.samples_per_read = int(0.1 * self.sample_rate)  # 0.1 second = 100 ms
        self.is_open = False
        self.stream = None

    def list_devices(self):
        """
        列出所有麦克风设备。
        Return:
            str, 所有的麦克风设备列表
        """
        devices = sd.query_devices()
        if len(devices) == 0:
            print("没有找到任何麦克风设备，请检查麦克风是否正常连接")
            sys.exit(0)
        return devices

    def select_device(self, device_id=""):
        """
        选择输入设备。
        :param device_id: 设备编号，默认None
        """
        if device_id != "":
            sd.default.device[0] = int(device_id)
        self.device_id = sd.default.device[0]
        self.is_open = True
        print(f'使用麦克风: {sd.query_devices()[self.device_id]["name"]}')

    def start_stream(self):
        """
        开始音频流。
        """
        if not self.is_open:
            print("麦克风未打开，无法开始音频流")
            return None

        self.stream = sd.InputStream(channels=1, dtype="float32", samplerate=self.sample_rate)
        self.stream.start()
        return self

    def read(self):
        """
        读取音频数据，并进行语音转录。
        """
        samples, _ = self.stream.read(self.samples_per_read)
        samples = samples.reshape(-1)
        return samples

    def close(self):
        """
        关闭麦克风。
        """
        if self.stream is not None:
            self.stream.stop()
            self.stream.close()
        self.is_open = False
        print("麦克风已关闭")

    def __enter__(self):
        return self.start_stream()

    def __exit__(self, exc_type, exc_value, traceback):
        self.close()
